#pragma once

#include "sceneBase.h"
#include "object.h"
#include <list>
#include <map>
#include <random>
#include <SDL_mixer.h>
#include <SDL_ttf.h>

class Game;

class SceneMain : public SceneBase
{
public:
    SceneMain();
    ~SceneMain();


    /**
     * 初始化场景
     */
    virtual void init() override;

    /**
     * 逻辑更新
     */
    virtual void update(float deltaTime) override;

    /**
     * 渲染场景
     */
    virtual void render() override;

    /**
     * 清理场景资源
     */
    virtual void clean() override;

    /**
     * 处理事件
     */
    virtual void handleEvent(SDL_Event* event) override;

    /**
     * 键盘控制
     */
    void keyboardControl(float deltaTime);

    /**
     * 更新玩家
     */
    void updatePlayer(float deltaTime);

    /**
     * 更新子弹运动
     */
    void updateProjectiles(float deltaTime);

    /**
     * 生成敌人
     */
    void spawnEnemy();

    /**
     * 更新敌人
     */
    void updateEnemies(float deltaTime);

    /**
     * 渲染敌人
     */
    void renderEnemies();

    /**
     * 生成敌机子弹
     */
    void spawnEnemyProjectile(Enemy* enemy);

    /**
     * 更新敌机子弹
     */
    void updateEnemyProjectiles(float deltaTime);

    /**
     * 渲染敌机子弹
     */
    void renderEnemyProjectiles();

    /**
     * 计算敌人子弹发射方向
     */
    SDL_FPoint getShootDirection(Enemy* enemy);

    /**
     * 敌机爆炸
     */
    void enemyExplode(Enemy* enemy);

    /**
     * 更新爆炸动画
     */
    void updateExplosions(float deltaTime);

    /**
     * 渲染爆炸动画
     */
    void renderExplosions();

    /**
     * 更新掉落物逻辑
     */
    void updateItems(float deltaTime);

    /**
     * 渲染掉落物
     */
    void renderItems();

    /**
     * 玩家获得道具
     */
    void playerGetItem(Item* item);

    /**
     * 渲染UI
     */
    void renderUI();
private:
    Game& game;
    Player player;
    bool isPlayerAlive = true;

    Projectile ProjectilePlayerTemplate;
    std::list<Projectile*> playerProjectiles;

    EnemyProjectile ProjectileEnemyTemplate;
    Enemy enemyTemplate;
    std::list<Enemy*> enemies;
    std::list<EnemyProjectile*> enemyProjectiles;

    // 随机数
    std::mt19937 gen; // 随机数生成器
    std::uniform_real_distribution<float> dis; // 随机数分布器

    Explosion explosionTemplate;
    std::list<Explosion*> explosions;

    Item itemTemplate;
    std::list<Item*> items;

    Mix_Music* bgm; // 背景音乐
    std::map<std::string, Mix_Chunk*> effectSounds; // 音效

    SDL_Texture* uiHealth; // UI血条

    TTF_Font* scoreFont; // 字体
    int score = 0;
};